package com.juzipi.demo.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcDemo {
    public static void main(String[] args) throws SQLException {
        // JDBC
        /*
         概念：Java数据库连接，Java语言操作数据库
         JDBC本质：其实是官方定义的一套操作所有关系型数据库的规则，即接口。各个数据库厂商去实现这套接口，提供数据库驱动jar包，
         我们可以使用这套接口（JDBC）编程，真正执行的代码是驱动jar包中的实现类
         */
        //  快速入门：

        //获取数据库连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT", "zhangsan", "lsjxj");
        //定义sql语句
        String s = "insert into practice(name, age, gender) VALUES ('张三',20,'男')";
        //获取执行sql的对象 Statement
        Statement statement = connection.createStatement();
        //执行sql
        boolean execute = statement.execute(s);
        //输出结果
        System.out.println(execute);
        //释放资源
        statement.close();
        connection.close();


        /*
        详解各个对象：
            1.DriverManager：驱动管理对象
            功能：
                1.注册驱动
                static void registerDriver(Driver driver): 注册与给定的驱动程序 DriverManager
                注意：mysql 5之后的驱动jar包可以省略注册驱动的步骤

                2.获取数据库连接
                方法：static Connection getConnection(String url,String user,String password)
                参数：
                    url: 指定连接的路径
                        如果是 本地ip和默认mysql端口 可以省略不写
                    user: 用户名
                    password: 密码

            2.Connection：数据库连接对象
            功能：
                1.获取执行sql的对象
                Statement createStatement()
                PreparedStatement preparedStatement(String sql)
                2.管理事务
                开启事务：setAutoCommit(boolean autoCommit): 调用该方法设置参数为false，即开启事务
                提交事务：commit()
                回滚事务：rollback()

            3.Statement：执行sql对象
            执行sql：
                1.boolean execute(String sql): 可以执行任意的sql
                2.int executeUpdate(String sql): 执行DML(insert,update,delete)语句和DDL(create,alter,drop)语句
                    返回值：影响的行数，可以通过影响行数判断DML语句是否执行成功，大于 0 应该就是成功了，否则就失败
                3.ResultSet executeQuery(String sql): 执行DQL语句(select)语句
            4.ResultSet：结果集对象,封装查询结果
                1.boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据)，如果是返回false，不是则返回true
                2.getXXX(参数): 获取数据
                    XXX：代表数据类型      例如：int  getInt()    String getString()
                    参数：
                        int：代表列的编号,从1开始      例如：getString(1)
                        String：代表列名称        例如：getString("name")
                注意：
            5.PreparedStatement：执行sql对象
                SQL注入问题：在拼接sql时，有一些sql的特殊关键字参与字符串的拼接，会有安全性问题
                    1.输入用户名，输入密码 a' or 'a' = 'a
                    select * from user where name = 'asdasd' and user.pwd = 'a' or 'a' = 'a'
                解决sql注入问题，使用prepareStatement对象来解决
                预编译的sql：参数使用 ? 作为占位符

                1.导入驱动jar包
                2.注册驱动
                3.获取数据库连接对象 Connection
                4.定义sql
                在定义sql的时候：
                    sql的参数使用 ? 作为占位符
                    select * from user where name = ? and pwd = ?;
                获取对象变为
                    PreparedStatement   Connection.prepareStatement(String sql)
                5.获取执行sql语句的对象 PreparedStatement   Connection.prepareStatement(String sql)
                6.给 ? 赋值
                    1.方法：setXXX(参数1，参数2)
                        参数1：? 的位置编号，从1开始
                        参数2：? 的值
                7.执行sql，接收返回结果，不需要传递sql语句
                8.处理结果
                9.释放资源
            注意：后期都会使用 PreparedStatement 来完成增删改查所有的操作
                1.可以防止sql注入
                2.效率更高
         */


        /*
        JDBC 控制事务
        1.事务：包含多个步骤的业务操作，被事务管理后要么同时成功，要么同时失败
        2.操作：
            1.开启事务
            2.提交事务
            3.回滚事务
        3.使用 Connection 对象管理事务
            * 开启事务：setAutoCommit(boolean autoCommit): 调用该方法设置参数为false，即开启事务
                在执行 sql 之前开启事务
            * 提交事务：commit()
                当所有 sql 都执行后提交事务
            * 回滚事务：rollback()
                在 catch 中回滚事务
            * MySQL数据库中事务默认自动提交
         */

    }
}
